linux 实时线程优先级问题 |
您所在的位置:网站首页 › 进程优先级 线程优先级 › linux 实时线程优先级问题 |
今天查看了linux下的实时线程,FIFO和RR策略的调度,遇到一个问题: priority越大优先级越高呢?还是越小越高呢? 回答这个问题要明白一个问题,首先,linux2.6内核将任务优先级进行了一个划分: 0——99 实时进程 100——139 非实时进程 现在,这个划分是起决定作用的,而且一定是数值越小,优先级越高。 但是,有时候从网上会看到 优先级数值越大,优先级越高?这又是怎么回事?难道有一种说法错了吗? 实际的原因是这样的,对于一个实时进程,他有两个参数来表明优先级——prio 和 rt_priority, prio才是调度所用的最终优先级数值,这个值越小,优先级越高; 而rt_priority 被称作实时进程优先级,他要经过转化——prio=MAX_RT_PRIO - 1- p->rt_priority; MAX_RT_PRIO = 99;这样意味着rt_priority值越大,优先级越高; 而内核提供的修改优先级的函数,是修改rt_priority的值,所以越大,优先级越高。 所以用户在使用实时进程或线程,在修改优先级时,就会有“优先级值越大,优先级越高的说法”,也是对的。
http://bbs.chinaunix.net/thread-1996337-1-1.html 关于进程时间片的计算 进程的时间片time_slice是基于进程静态优先级的。 静态优先级越高(值越小),时间片就越大。 计算时间片是通过函数task_timeslice()(kernel/sched.c)来完成的。 通过优先级来计算时间片的等式为: timeslice=MIN_TIMESLICE+((MAX_TIMESLICE-MIN_TIMESLICE)*(MAX_PRIO-1-(p)->static_prio)/(MAX_USER_PRIO-1)) 这样的话就可以将100~139 的优先级映射到200ms~10ms 的时间片上去,优先级数值越大,则分配的时间片越小。 在Kernel2.6中时间片的计算是分散的,具体的计算既可以用task_timeslice(),也可以用其他方法。 进程创建时,将父进程的时间片分一半给子进程,同时父进程的时间片减半。 进程用完时间片以后,需要重新计算时间片,并将进程插入到相应的运行队列。 进程退出时,根据first_timeslice的值来决定是否将子进程的时间片返还给父进程。 平均等待时间sleep_avg 平均等待时间sleep_avg既决定了进程优先级,又影响了进程交互程度。 进程的平均等待时间(以nanosecond 为单位),在0 到NS_MAX_SLEEP_AVG 之间取值,初值为0。 这个值是动态优先级计算的关键因子,sleep_avg 越大,计算出来的进程优先级也越高(数值越小)。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |